﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EyFramework.Common;
using EyFramework.Main;
using EyFramework.Task.Entity;
using EyFramework.ThirdPart.RedisUtil;
using Topshelf;

namespace EyFramework.Task.Starter
{
    internal class Program
    {
        private delegate bool ConsoleCtrlDelegate(int dwCtrlType);

        private const int CTRL_CLOSE_EVENT = 2;

        //导入SetCtrlHandlerHandler API
        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);

        private static void Main(string[] args)
        {
            ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
            if (SetConsoleCtrlHandler(newDelegate, true))
            {
                //初始化配置文件
                Globals.appConfigure = new AppConfigure();
                //启动主程序,初始化数据库链接等环境
                StartDevApp.RunTaskApp(args);
                var hasSaveTask = RedisHelper.Get<WinTaskServiceState>(TaskConstants.WINSERVER_REDIS_KEY);
                if (hasSaveTask != null)
                {
                    if (Globals.ShowYesNoAndWarning(string.Format("检测到已经存在调度器正在运行，IP:{0},启动时间:{0},是否继续启动？",
                        hasSaveTask.HostIp, hasSaveTask.StartTime)) == DialogResult.Yes)
                    {
                        RedisHelper.Remove(TaskConstants.WINSERVER_REDIS_KEY);
                    }
                    else
                    {
                        Environment.Exit(0);
                    }
                }

                // 配置和运行宿主服务
                HostFactory.Run(x =>
                {
                    x.Service<QuartzServiceRunner>();
                    ////服务器使用内置账户运行
                    x.RunAsLocalService();
                    //// 服务自动启动（延时启动） -- 需要 .NET 4.0 或以上版本
                    x.StartAutomaticallyDelayed();
                    // 服务描述信息
                    x.SetDescription("萧山区第二人民医院后台定时任务服务");
                    // 服务显示名称
                    x.SetDisplayName("萧二定时服务");
                    // 服务名称
                    x.SetServiceName("XseyScheduler");
                    x.EnablePauseAndContinue();
                });
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("抱歉，API注入失败，按任意键退出！");
            }
        }

        /// <summary>
        /// 处理程序例程，在这里编写对指定事件的处理程序代码
        /// </summary>
        /// <param name="CtrlType"></param>
        /// <returns></returns>
        private static bool HandlerRoutine(int CtrlType)
        {
            switch (CtrlType)
            {
                case CTRL_CLOSE_EVENT: //用户要关闭Console了
                    RedisHelper.Remove(TaskConstants.WINSERVER_REDIS_KEY);
                    return true;

                default:
                    return true;
            }
        }
    }
}